#!/usr/bin/env python2.5
# -*- coding: iso-8859-15 -*-
import os, sys
from google.appengine.api import users
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.ext import db
from google.appengine.ext.webapp import template
from google.appengine.api import mail

# ClientesDB: Guarda o perfil do cliente
class ClientesDB(db.Model):
	author	   = db.UserProperty(required=True)
	email= db.StringProperty()
	nome = db.StringProperty()
	telefone  = db.StringProperty()
	pais   = db.StringProperty()
	cidade	     = db.StringProperty()
	morada	   = db.StringProperty()
	cp	     = db.StringProperty()
	selrota = db.StringProperty()

#  PedidosDB: Guarda os pedidos dos clientes.	
class PedidosDB(db.Model):
	author	   = db.UserProperty(required=True)
	email= db.StringProperty()
	assunto=db.StringProperty()
	dtsub = db.DateTimeProperty(auto_now=True)
	descpedido = db.StringProperty(multiline=True)
	estado = db.StringProperty()

#  LocalOrigemDB: Guarda a localizacao de origem 
class LocalOrigemDB(db.Model):
  author = db.UserProperty()
  defeito=db.StringProperty()
  pais   = db.StringProperty()
  cidade	     = db.StringProperty()
  morada	   = db.StringProperty()
  cp	     = db.StringProperty()

# Pagina principal
class MainPage(webapp.RequestHandler):
    def get(self):
	user = users.get_current_user()
	url = users.create_login_url(self.request.uri)
	url_linktext = 'Login'

	if user:
	    url = users.create_logout_url(self.request.uri)
	    url_linktext = 'Logout'
		# GQL is similar to SQL
	cperfil= ClientesDB.gql("WHERE author = :author",author=users.get_current_user())
	values = {
	    'cperfil': cperfil,
	    'nperfil' : cperfil.count(),
	    'user': user,
	    'url': url,
	    'url_linktext': url_linktext,
	}
	self.response.out.write(template.render('clientes.html', values))

# Classe para mostrar a pagina inicial na area adminsitrativa	
class Admin(webapp.RequestHandler):
    def get(self):
	user = users.get_current_user()
	url = users.create_login_url(self.request.uri)
	url_linktext = 'Login'

	if user:
	    url = users.create_logout_url(self.request.uri)
	    url_linktext = 'Logout'
	pedidos = PedidosDB.all()
	clientes=ClientesDB.all()
	localizacao=LocalOrigemDB.all()
	values = {
	    'pedidos': pedidos,
		'clientes':clientes,
		'localizacao':localizacao,
		'nlocalizacao':localizacao.count(),
	    'numeropedidos' : pedidos.count(),
		'user': user,
	    'url': url,
	    'url_linktext': url_linktext,
	}
	if users.is_current_user_admin():
		self.response.out.write(template.render('admin.html', values))
	else:
		self.redirect('/')

# Classe para permitir a vizualizacao de um perfil pelo adminsitrador		
class AdmCPerf(webapp.RequestHandler):
    def get(self):
	user = users.get_current_user()
	url = users.create_login_url(self.request.uri)
	url_linktext = 'Login'

	if user:
	    url = users.create_logout_url(self.request.uri)
	    url_linktext = 'Logout'
		# GQL is similar to SQL
	email=self.request.get('id')
	cperfil= ClientesDB.gql("WHERE email = :ema",ema=self.request.get('id'))
	values = {
	    'cperfil': cperfil,
	    'nperfil' : cperfil.count(),
	    'user': user,
	    'url': url,
	    'url_linktext': url_linktext,
	}
	self.response.out.write(template.render('admcperf.html', values))
	
# Classe para permitir a vizualizacao de um pedido pelo adminsitrador	
class AdmPedi(webapp.RequestHandler):
	def get(self):
		user = users.get_current_user()
		url = users.create_login_url(self.request.uri)
		url_linktext = 'Login'

		if user:
			url = users.create_logout_url(self.request.uri)
			url_linktext = 'Logout'
			raw_id = self.request.get('id')
			id = int(raw_id)
		pedido = PedidosDB.get_by_id(id)
		values = {
			'pedido':pedido,
			'user': user,
			'url': url,
			'url_linktext': url_linktext,
		}
		self.response.out.write(template.render('admpedi.html', values))	

#Classe para criar e alterar a localizacao de origem
class ALocalOrigem(webapp.RequestHandler):
    def post(self):
	user = users.get_current_user()
	if user:
		origem= LocalOrigemDB.all()
		if origem.count() == 0:
			defineorigem = LocalOrigemDB(author	= users.get_current_user(),
			defeito="1",
			pais = self.request.get('pais'),
			cidade = self.request.get('cidade'),
			morada = self.request.get('morada'),
			cp = self.request.get('cp'))
			
			defineorigem.put();
			self.redirect('/admin')
		else:
			for local in origem:
				local.pais = self.request.get('pais')
				local.cidade = self.request.get('cidade')
				local.morada = self.request.get('morada')
				local.cp = self.request.get('cp')
			local.put();
			self.redirect('/admin')

#Classe para marcar os clientes para calculo da rota
class AdmMPRota(webapp.RequestHandler):
   def get(self):
	user = users.get_current_user()
	url = users.create_login_url(self.request.uri)
	url_linktext = 'Login'

	if user:
	    url = users.create_logout_url(self.request.uri)
	    url_linktext = 'Logout'
		
	raw_id = self.request.get('id')
	id = int(raw_id)
	fpedidos = PedidosDB.get_by_id(id)
	#ema=fpedidos.email
	#fpedidos=PedidosDB.gql("WHERE email = :ema",ema=self.request.get('id'))
	cperfil= ClientesDB.gql("WHERE email = :ema",ema=fpedidos.email)
	for perfil in cperfil:
		perfil.selrota="sim"	
	
	#for pedido in fpedidos:
	fpedidos.estado="Fechado"			
	
	perfil.put();
	fpedidos.put();
	
	self.redirect('/admin')	

#Classe para desmarcar os clientes para calculo da rota
class AdmMNRota(webapp.RequestHandler):
   def get(self):
	user = users.get_current_user()
	url = users.create_login_url(self.request.uri)
	url_linktext = 'Login'

	if user:
	    url = users.create_logout_url(self.request.uri)
	    url_linktext = 'Logout'
		
	raw_id = self.request.get('id')
	id = int(raw_id)
	fpedidos = PedidosDB.get_by_id(id)
	#ema=fpedidos.email
	#fpedidos=PedidosDB.gql("WHERE email = :ema",ema=self.request.get('id'))
	cperfil= ClientesDB.gql("WHERE email = :ema",ema=fpedidos.email)
	for perfil in cperfil:
		perfil.selrota="nao"	
	
	#for pedido in fpedidos:
	fpedidos.estado="Reaberto"			
	
	perfil.put();
	fpedidos.put();
	self.redirect('/admin')	
	
#Classe que mostra o template html com a rota auto
class AdmGRota(webapp.RequestHandler):
    def get(self):
	user = users.get_current_user()
	url = users.create_login_url(self.request.uri)
	url_linktext = 'Login'

	if user:
	    url = users.create_logout_url(self.request.uri)
	    url_linktext = 'Logout'
		# GQL is similar to SQL
	clientes=ClientesDB.all()
	clientes = db.GqlQuery("SELECT * FROM ClientesDB " +  "WHERE selrota = :1","sim")
	
	origem=LocalOrigemDB.all()

	values = {
	    'clientes': clientes,
	    'nclientes' : clientes.count(),
	    'user': user,
	    'origem': origem,
	    'url_linktext': url_linktext,
	}
	self.response.out.write(template.render('admrota.html', values))

#Classe que mostra o template html com a rota personal
class AdmGRotaP(webapp.RequestHandler):
    def get(self):
	user = users.get_current_user()
	url = users.create_login_url(self.request.uri)
	url_linktext = 'Login'

	if user:
	    url = users.create_logout_url(self.request.uri)
	    url_linktext = 'Logout'
		# GQL is similar to SQL
	clientes=ClientesDB.all()
	clientes = db.GqlQuery("SELECT * FROM ClientesDB " +  "WHERE selrota = :1","sim")
	
	origem=LocalOrigemDB.all()

	values = {
	    'clientes': clientes,
	    'nclientes' : clientes.count(),
	    'user': user,
	    'origem': origem,
	    'url_linktext': url_linktext,
	}
	self.response.out.write(template.render('admrotap.html', values))
# Classe para efectuar pedidos
class Epedidos(webapp.RequestHandler):
   def get(self):
	user = users.get_current_user()
	url = users.create_login_url(self.request.uri)
	url_linktext = 'Login'
	alerta='num pode...'
	if user:
	    url = users.create_logout_url(self.request.uri)
	    url_linktext = 'Logout'
		# GQL is similar to SQL
	values = {
	    'user': user,
	    'url': url,
		'alerta':alerta,
	    'url_linktext': url_linktext,
	}
	self.response.out.write(template.render('epedidos.html', values))

# Classe para listar pedidos na area de clientes	
class Lpedidos(webapp.RequestHandler):
   def get(self):
	user = users.get_current_user()
	url = users.create_login_url(self.request.uri)
	url_linktext = 'Login'

	if user:
	    url = users.create_logout_url(self.request.uri)
	    url_linktext = 'Logout'
		
	pedidos = PedidosDB.gql("WHERE author = :1 ",users.get_current_user())
	values = {
	    'pedidos': pedidos,
	    'numeropedidos' : pedidos.count(),
		'user': user,
	    'url': url,
	    'url_linktext': url_linktext,
	}
	self.response.out.write(template.render('lpedidos.html', values))

# Classe para permitir a edicao de pedidos na area de clientes		
class Apedidos(webapp.RequestHandler):
	def get(self):
		user = users.get_current_user()
		url = users.create_login_url(self.request.uri)
		url_linktext = 'Login'

		if user:
			url = users.create_logout_url(self.request.uri)
			url_linktext = 'Logout'
			raw_id = self.request.get('id')
			id = int(raw_id)
		pedido = PedidosDB.get_by_id(id)
		values = {
			'pedido':pedido,
			'user': user,
			'url': url,
			'url_linktext': url_linktext,
		}
		self.response.out.write(template.render('apedidos.html', values))

# Classe para criar e alterar o perfil na area de clientes	
class Aperfil(webapp.RequestHandler):
    def post(self):
	user = users.get_current_user()
	if user:
		cperfil= ClientesDB.gql("WHERE author = :author",author=users.get_current_user())
		if cperfil.count() == 0:
			perfil = ClientesDB(author	= users.get_current_user(),
			email=user.email(),
			nome = self.request.get('nome'),
			telefone = self.request.get('telefone'),
			pais = self.request.get('pais'),
			cidade = self.request.get('cidade'),
			morada = self.request.get('morada'),
			cp = self.request.get('cp'))
			
			perfil.put();
			self.redirect('/')
		else:
			for perfil in cperfil:
				perfil.nome= self.request.get('nome')
				perfil.telefone = self.request.get('telefone')
				perfil.pais = self.request.get('pais')
				perfil.cidade = self.request.get('cidade')
				perfil.morada = self.request.get('morada')
				perfil.cp = self.request.get('cp')
			perfil.put();
			self.redirect('/')

# Classe para criar um pedido na area de clientes		
class Novo(webapp.RequestHandler):
    def post(self):
	user = users.get_current_user()
	if user:
	    nvpedido = PedidosDB(author	= users.get_current_user(),
		email=user.email(),
		assunto = self.request.get('assunto'),
		estado="Submetido",
		descpedido=self.request.get('descpedido'))
	
	nvpedido.put();
	self.redirect('/lpedidos')

# classe para apagar os pedidos na area de clientes	
class Apagar(webapp.RequestHandler):
    def get(self):
	user = users.get_current_user()
	if user:
	    raw_id = self.request.get('id')
	    id = int(raw_id)
	    pedido = PedidosDB.get_by_id(id)
	    pedido.delete()
	    self.redirect('/lpedidos')

# classe para alterar os pedidos na area de clientes	
class Editar(webapp.RequestHandler):
   def post(self):
	user = users.get_current_user()
	if user:
	    id=int(self.request.get('numero'))
	apedido = PedidosDB.get_by_id(id)
	apedido.assunto = self.request.get('assunto')
	apedido.estado="Alterado"
	apedido.descpedido=self.request.get('descpedido')
	
	apedido.put();
	self.redirect('/lpedidos')

#Envia o Email com o estado do pedido
class Email(webapp.RequestHandler):
    def get(self):
	user = users.get_current_user()
	if user:
	    raw_id = self.request.get('id')
	    id = int(raw_id)
	    pedido = PedidosDB.get_by_id(id)
	    message = mail.EmailMessage(sender=user.email(),
		subject="Alteracao do estado do pedido")
	    message.to = user.email()
	    message.body = "Pedido selecionado para processamento"
	    message.send()
	    self.redirect('/')

# Definicao da associacao da URL com as Classes
application = webapp.WSGIApplication(
    [('/', MainPage),
	('/admin', Admin),
	('/admcperf',AdmCPerf),
	('/admpedi',AdmPedi),
	('/admmprota',AdmMPRota),
	('/admmnrota',AdmMNRota),
	('/admgrota',AdmGRota),
	('/admgrotap',AdmGRotaP),
	('/alocalorigem',ALocalOrigem),
	('/aperfil', Aperfil),
	('/epedidos', Epedidos),
	('/apedidos', Apedidos),
	('/lpedidos', Lpedidos),
	('/novo', Novo),
	('/editar', Editar),
	('/apagar', Apagar),
	('/email', Email)],
    debug=True)

# Registo da aplicacao para correr
def main():
    run_wsgi_app(application)

if __name__ == "__main__":
    main()
